/*
描述：
    你是急救队的队长，有一张特殊的地图，画着一些被道路联通的离散的城市。在地图上
还标记着每座城市拥有的医疗队的数量，道路的长度。你的职责是当有急救电话的时候，调
遣你的医疗队尽可能多尽可能快的赶到。
输入：
    第一行包含四个正数：
        N（<=500）城市的数目，并且城市从0到N-1标号
        M 道路的数量
        C1 你当前所在的城市
        C2 你必须要赶到的城市
    第二行包含了N个整数，对应第N-1座城市所拥有的医疗队的数量
    接下来的M行，每一行用三个整数c1,c2（被链接的两座城市）和l（道路的长度）描述
    了一条道路。C1和C2之间至少有一条路。
输出：
    输出一行包含两个数字：C1和C2之间最短路径的条数和你能调遣到的最多的救援队伍

思路：DFS遍历
*/

#include <iostream>
#include <climits>
using namespace std;
#define INFINITY INT_MAX
int **graph;
int *weight;
int *record;
int minDist = INFINITY;
int maxTeam = 0;
int cnt = 0;
int N,M,start,dest;
//创建二维数组并且记录初始化为无穷
int **create2DArr(int row, int col, int init){
    int **arr = new int*[row]();
    for(int i=0; i<row; i++){
        arr[i] = new int[col]();
        for(int j=0; j<col; j++){
            arr[i][j] = init;
        }
    }
    return arr;
}

int *create1DArr(int col, int init){
    int *arr = new int[col]();
    for(int i=0; i<col; i++){
        arr[i] = init;
    }
    return arr;
}

//深度优先遍历
void DFS(int current, int dest, int dist, int team){
    //递归基
    if(current == dest){
        if(dist < minDist){
            cnt = 1;
            minDist = dist;
            maxTeam = team;
        }else if(dist == minDist){
            cnt++;
            if(team > maxTeam){
                maxTeam = team;
            }
        }
        return;
    }
    //剪枝
    if(dist > minDist){
       return;
    }
    for(int i=0; i<N; i++){
        if (record[i] == 1 && graph[current][i] != INFINITY) {
            //将i点置为访问过状态，防止路径倒回去
            record[i] = 0;
            DFS(i, dest, dist + graph[current][i], team + weight[i]);
            //一条路径访问结束后，该点可以被其他路径再次访问
            record[i] = 1;
        }
    }
}

int main() {
    cin >> N >> M >> start >> dest;
    graph = create2DArr(N, N, INFINITY);
    weight = create1DArr(N, 0);
    record = create1DArr(N, 1);
    //读入救援队数目数组
    for(int i=0; i<N; i++){
        cin >> weight[i];
    }

    int n1,n2;
    for(int i=0; i<M; i++){
        cin >> n1 >> n2;
        int dist = 0;
        cin >> dist;
        graph[n1][n2] = graph[n2][n1] = dist;
    }

    DFS(start,dest,0,weight[start]);

    cout << cnt << " " << maxTeam;

    return 0;
}